import { defineStore } from 'pinia'
import { ref, computed } from 'vue'
import { getUserInfoAPI } from '@/api/user.js'

// 1. 手动从本地存储加载数据
const loadFromStorage = () => {
  try {
    const stored = uni.getStorageSync('user-store')
    if (stored) {
      return JSON.parse(stored)
    }
  } catch (e) {
    console.error('加载本地存储失败:', e)
  }
  return { token: '', userInfo: {}, avatarUrl: '' } // 初始化时包含avatarUrl
}

// 2. 手动保存数据到本地存储
const saveToStorage = (data) => {
  try {
    uni.setStorageSync('user-store', JSON.stringify(data))
  } catch (e) {
    console.error('保存到本地存储失败:', e)
  }
}

export const useUserStore = defineStore(
  'user',
  () => {
    // 初始化时从本地加载数据
    const storedData = loadFromStorage()
    const token = ref(storedData.token)
    const userInfo = ref(storedData.userInfo)
    const avatarUrl = ref(storedData.avatarUrl) // 从本地存储加载

    // 3. 同步数据到本地存储的通用方法 - 新增avatarUrl
    const syncStorage = () => {
      saveToStorage({
        token: token.value,
        userInfo: userInfo.value,
        avatarUrl: avatarUrl.value // 保存avatarUrl到本地
      })
    }

    // token管理（自动同步存储）
    const setToken = (tokenValue) => {
      token.value = tokenValue
      syncStorage()
    }
    const removeToken = () => {
      token.value = ''
      syncStorage()
    }

    // 新增：设置头像URL的方法
    const setAvatarUrl = (url) => {
      avatarUrl.value = url
      syncStorage() // 同步到本地存储
    }

    // 检查登录状态
    const isLoggedIn = computed(() => {
      return !!userInfo.value.id
    })

    // 登录动作（带异步处理）
    const loginAction = async (newToken, id) => {
      setToken(newToken)
      await getUserInfo(id)
    }

    // 设置用户信息（自动同步存储）
    const setUserInfo = (info) => {
      userInfo.value = info ? { ...info } : {}
      // 如果用户信息中包含头像，同步到avatarUrl
      if (info?.avatar) {
        avatarUrl.value = info.avatar
      }
      syncStorage()
    }

    // 获取用户信息（从后端）
    const getUserInfo = async (id) => {
      const realId = id || userInfo.value?.id
      if (!realId) throw new Error('用户ID不存在，无法获取信息')

      const res = await getUserInfoAPI(realId)
      if (res.code === 1 && res.data) {
        setUserInfo(res.data)
      } else {
        throw new Error(res.msg || '获取用户信息失败')
      }
    }

    // 退出登录（清空并同步）
    const logout = () => {
      removeToken()
      userInfo.value = {}
      avatarUrl.value = ''
      syncStorage()
    }

    return {
      token,
      setToken,
      removeToken,
      loginAction,
      isLoggedIn,
      userInfo,
      setUserInfo,
      getUserInfo,
      logout,
      avatarUrl,
      setAvatarUrl
    }
  }
)
    